package ControladorPersistencia;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;

import Dao.ListaPreciosDao;
import Dao.ProveedorDao;
import Negocio.ItemListaPrecios;
import Negocio.ItemListaPreciosCPR;
import Negocio.ListaPreciosCPR;
import Negocio.Proveedor;
import Negocio.Rodamiento;

public class AdminProveedor {

	
private static ProveedorDao dao;
	
private static AdminProveedor instance;

	static {
		dao = (ProveedorDao) ProveedorDao.getInstancia();
	}
	
	public static AdminProveedor getInstance()
	{
		if(instance == null)
			instance= new AdminProveedor();
		return instance;
	}
	
	public void grabarProveedor(Proveedor proveedor){
		dao.agregarProveedor(proveedor);
	}
	
	public Proveedor buscarProveedor(int codigo){
		return dao.buscarProveedorXCodigo(codigo);
	}
	
	public Proveedor buscarProveedorXNombre(String nombre)
	{
		return dao.buscarProveedorXNombre(nombre);
	}

	public Proveedor buscarProveedorXCuit(String cuit)
	{
		return dao.buscarProveedorXNombre(cuit);
	}
	public void borrarProveedor(int codigo){
		dao.borrarProveedor(codigo);
	}

	public ArrayList<Proveedor> obtenerProveedores() {
		ArrayList<Proveedor> proveedores = dao.obtenerProveedores();
		return proveedores;
	}

	public void modificarProveedor(Proveedor prov) throws RemoteException {
		dao.modificarProveedor(prov);		
	}

	public ItemListaPreciosCPR obtenerPrecioMinimoRodamiento(Rodamiento r) {
		
		// Creo un item con precio = no existe ningun precio.
		ItemListaPreciosCPR item=new ItemListaPreciosCPR(r, -1, "No existe", "No existe" ,"No existe" );
		// TODO Auto-generated method stub
		Object o[] = dao.obtenerPreciosMinimoRodamiento(r.getCodigo(),r.getMarca(),r.getOrigen());
		if (o!=null)
		{
			// lp.tipo,min(item.precioCompra),item.marca,item.origen,item.tipo
			item.setTipoLista((String) o[0]);
			item.setPrecioUnitario(calcularPrecioConGanancia((Float)o[1]));
			item.setMarca((String) o[2]);
			item.setOrigen((String)o[3]);
			item.setTipo((String)o[4]);
			item.setProveedor((Proveedor) o[5]);
			
		}
		return item;
		
	}
	
	public ListaPreciosCPR obtenerListaPreciosCPR()
	{
		return dao.obtenerListaPreciosCPR();
	}
	
	public void reemplazarListaPreciosCPR(ListaPreciosCPR l)
	{
		dao.borrarListaPrecioCRP();
		dao.guardarListaPreciosCPR(l);
	}

	public ArrayList<ItemListaPreciosCPR> obtenerPreciosRodamiento(
			String codigo, String marca, String pais) {
		
		// Creo un item con precio = no existe ningun precio.
		ArrayList<ItemListaPreciosCPR> items = new ArrayList<ItemListaPreciosCPR>();
		ArrayList<Object[]> os = dao.obtenerPreciosRodamientos(codigo,marca,pais);
		Iterator<Object[]> it = os.iterator();
		while(it.hasNext())
		{
			Object o[] = it.next();
			ItemListaPreciosCPR item=new ItemListaPreciosCPR();
			// lp.tipo,min(item.precioCompra),item.marca,item.origen,item.tipo
			item.setTipoLista((String) o[0]);
			item.setPrecioUnitario(calcularPrecioConGanancia((Float)o[1]));
			item.setMarca((String) o[2]);
			item.setOrigen((String)o[3]);
			item.setTipo((String)o[4]);
			item.setProveedor((Proveedor) o[5]);
			item.setRodamiento((Rodamiento) o[6]);
			items.add(item);
		}
		return items;
	}
	
	private Float calcularPrecioConGanancia(Float costo)
	{
		Float porcentajeGanancia = AdminGanacia.getInstancia().getPorcentajeGanacia();
		return costo + costo *  porcentajeGanancia / 100;
	}
	
	public ItemListaPrecios obtenerListaPrecio(int rodId, String origen, String marca){
		return ListaPreciosDao.getInstancia().obtenerItemListaPrecios(rodId, marca, origen);
	}

}
